package com.itheima.service.impl;

import com.alibaba.dubbo.config.annotation.Service;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.itheima.constant.MessageConstant;
import com.itheima.dao.MenuDao;
import com.itheima.entity.PageResult;
import com.itheima.pojo.Menu;
import com.itheima.pojo.Permission;
import com.itheima.service.MenuService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
import java.util.Map;

@Service(interfaceClass = MenuService.class)
@Transactional
public class MenuServiceImpl implements MenuService {
    @Autowired
    private MenuDao menuDao;

    /**
     * 菜单管理分页查询
     *
     * @param currentPage
     * @param pageSize
     * @param queryString
     * @return
     */
    @Override
    public PageResult findPage(Integer currentPage, Integer pageSize, String queryString) {
        //之前：业务逻辑1.查询总记录数  2.查询当前页面显示数据
        //1.设置分页参数
        PageHelper.startPage(currentPage, pageSize);
        //2.需要分页的语句
        Page<Menu> menuPage = menuDao.selectByCondition(queryString);
        return new PageResult(menuPage.getTotal(), menuPage.getResult());
    }

    /**
     * 删除菜单
     *
     * @param id
     * @return
     */
    @Override
    public void deleteById(Integer id) {
//        根据id查询有没有相关联的子菜单，如果有，抛出不允许删除
        int count = menuDao.findSonCountById(id);
        if (count > 0) {
            throw new RuntimeException(MessageConstant.DELETE_MENU_HAVE_SON);
        }
//       如果没有相关联或者是子菜单， 可直接删除
        menuDao.deleteById(id);
    }

    /**
     * 查询新增窗口的父菜单编号为null的ID和名称
     *
     * @return
     */
    @Override
    public List<Map<String, Object>> findNameAndId() {
        return menuDao.findNameAndId();
    }

    /**
     * 新增菜单项
     *
     * @param menu
     * @return
     */
    @Override
    public void add(Menu menu) {
        if (menu.getParentMenuId() == null) {
            menu.setLevel(1);
            //如果parentMenuId为空，代表是父菜单，设置level的值为1
            menuDao.addNotParentMenuId(menu);
        } else {
            menu.setLevel(2);
            //如果parentMenuId不为空，代表是子菜单，设置level的值为2
            menuDao.addHaveParentMenuId(menu);
        }
    }
    /**
     * 查询所有 菜单信息
     */
    @Override
    public List<Menu> findAll() {
        return menuDao.findAll();
    }

    /**
     * 回显编辑窗口数据
     *
     * @param id
     * @return
     */
    @Override
    public Menu findMenuById(Integer id) {
        return menuDao.findMenuById(id);
    }

    /**
     * 编辑菜单项
     *
     * @param menu
     * @return
     */
    @Override
    public void edit(Menu menu) {
        //查询此菜单项是否有相关联的子菜单项
        int sonCount = menuDao.findSonCountById(menu.getId());
        //有关联的子菜单项
        if (sonCount > 0) {
            //不允许修改父菜单编号，判断用户有没有修改菜单编号（getParentMenuId）
            if (menu.getParentMenuId() != null) {
                throw new RuntimeException(MessageConstant.EDIT_MENU_HAVE_SON);
            } else {
                //如果getParentMenuId为空,就修改除了getParentMenuId的其他选项
                menuDao.edit(menu);
            }
            //没有关联的子菜单项
        } else {
            //如果没有添加ParentMenuId表示修改为父菜单项，把Level设置为1
            if (menu.getParentMenuId() == null) {
                menu.setLevel(1);
                menuDao.edit(menu);
            //如果添加了ParentMenuId表示修改为子菜单项，把Level设置为2
            } else {
                menu.setLevel(2);
                menuDao.edit(menu);
            }
        }
    }


}
